package com.jcn.seckill.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jcn.seckill.domain.User;
import com.jcn.seckill.redis.RedisService;
import com.jcn.seckill.redis.UserKey;
import com.jcn.seckill.result.CodeMsg;
import com.jcn.seckill.result.Result;
import com.jcn.seckill.service.UserService;

//定义一个 Controller 控制器
@Controller
//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
@RequestMapping("/demo")
public class SampleController {
	
	//对类成员变量、方法及构造函数进行标注，完成自动装配的工作
	//@Autowired标注可以放在成员变量上，也可以放在成员变量的set方法上，也可以放在任意方法上表示
	@Autowired
	//注入服务   
	UserService UserService;
	//对类成员变量、方法及构造函数进行标注，完成自动装配的工作
	//@Autowired标注可以放在成员变量上，也可以放在成员变量的set方法上，也可以放在任意方法上表示
	@Autowired
	//注入服务  
	RedisService redisService;
	
	/**
	 * 1.rest api json输出模块  2.页面
	 * */
	
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/")
	//作用在方法上
  /**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
	@ResponseBody
	String home() {	
		return "halo";
	}
	
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/hello")
	/**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
	@ResponseBody
	public Result<String> hello() {
		//成功只把数据传进去，不用每次都要去new
		return Result.success("halo,剑主");
  	//return new Result(0,"success","halo,剑主");
  }
	
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/helloError")
	/**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
	@ResponseBody
	public Result<String> helloError() {
		//失败只把CodeMsg传进去，返回SERVER_ERROR
		return Result.error(CodeMsg.SERVER_ERROR);
  	//return new Result(500100,"successs失效");
  }
	 
    //映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/thymeleaf")
	//往model写一个对象
	public String thymeleaf(Model model) {
		//渲染model模板：将name对应的值剑主写到页面上
		model.addAttribute("name","剑主");
		return "hello";
  }   
	
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/db/get")
	/**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
	@ResponseBody
	public Result<User> dbGet() {
		User user = UserService.getById(1);
		return Result.success(user);
  }  
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/db/tx")
	/**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
	@ResponseBody
	public Result<Boolean> dbTx() {
		UserService.tx();
		return Result.success(true);
  }
	
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
	@RequestMapping("/redis/get")
	/**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
  @ResponseBody
  public Result<User> redisGet() {
		//读出一个user对象
		User  user  = redisService.get(UserKey.getById, ""+1, User.class);
        return Result.success(user); 
  }
  
	//映射请求,指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
  @RequestMapping("/redis/set")
  /**
   * 返回结果直接写入 HTTP response body 中，
   * 一般在异步获取数据时使用【也就是AJAX】，
   * 在使用 @RequestMapping后，返回值通常解析为跳转路径，
   * 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径，
   * 而是直接写入 HTTP response body 中。 比如异步获取 json 数据，
   * 加上 @ResponseBody 后，会直接返回 json 数据。@RequestBody 
   * 将 HTTP 请求正文插入方法中，
   * 使用适合的 HttpMessageConverter 将请求体写入某个对象。
   * */
  @ResponseBody
  public Result<Boolean> redisSet() {
  	User user  = new User();
  	user.setId(1);
  	user.setName("1111");
  	//UserKey:id1  UserKey就是类名：id1,不同模块类名不一样，同一个模块内部则通过id进行区分
  	redisService.set(UserKey.getById, ""+1, user);
      return Result.success(true);
  }
    
    
}
